Skip to content

Commit 7395152

Browse files
factor out coi, use polynomial elaboration for nlsat solver (#8039)
* factor out coi, use polynomial elaboration for nlsat solver Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * remove unused functionality Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> --------- Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
1 parent 9c588af commit 7395152

7 files changed

Lines changed: 339 additions & 126 deletions

File tree

src/ast/sls/sls_arith_base.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2620,8 +2620,10 @@ namespace sls {
26202620
display(out, ad) << "\n";
26212621
}
26222622
};
2623-
for (var_t v = 0; v < m_vars.size(); ++v) {
2623+
for (var_t v = 0; v < m_vars.size(); ++v) {
26242624
if (!eval_is_correct(v)) {
2625+
// if (m.rlimit().is_canceled())
2626+
// return;
26252627
report_error(verbose_stream(), v);
26262628
TRACE(arith, report_error(tout, v));
26272629
UNREACHABLE();

src/math/lp/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ z3_add_component(lp
2424
monomial_bounds.cpp
2525
nex_creator.cpp
2626
nla_basics_lemmas.cpp
27+
nla_coi.cpp
2728
nla_common.cpp
2829
nla_core.cpp
2930
nla_divisions.cpp

src/math/lp/nla_coi.cpp

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
2+
/*++
3+
Copyright (c) 2025 Microsoft Corporation
4+
5+
Author:
6+
Lev Nachmanson (levnach)
7+
Nikolaj Bjorner (nbjorner)
8+
--*/
9+
10+
#include "math/lp/nla_core.h"
11+
#include "math/lp/nla_coi.h"
12+
13+
namespace nla {
14+
15+
void coi::init() {
16+
indexed_uint_set visited;
17+
unsigned_vector todo;
18+
vector<occurs> var2occurs;
19+
m_term_set.reset();
20+
m_mon_set.reset();
21+
m_constraint_set.reset();
22+
m_var_set.reset();
23+
auto& lra = c.lra_solver();
24+
25+
for (auto ci : lra.constraints().indices()) {
26+
auto const& c = lra.constraints()[ci];
27+
if (c.is_auxiliary())
28+
continue;
29+
for (auto const& [coeff, v] : c.coeffs()) {
30+
var2occurs.reserve(v + 1);
31+
var2occurs[v].constraints.push_back(ci);
32+
}
33+
}
34+
35+
for (auto const& m : c.emons()) {
36+
for (auto v : m.vars()) {
37+
var2occurs.reserve(v + 1);
38+
var2occurs[v].monics.push_back(m.var());
39+
}
40+
}
41+
42+
for (const auto *t : lra.terms() ) {
43+
for (auto const iv : *t) {
44+
auto v = iv.j();
45+
var2occurs.reserve(v + 1);
46+
var2occurs[v].terms.push_back(t->j());
47+
}
48+
}
49+
50+
for (auto const& m : c.to_refine())
51+
todo.push_back(m);
52+
53+
for (unsigned i = 0; i < todo.size(); ++i) {
54+
auto v = todo[i];
55+
if (visited.contains(v))
56+
continue;
57+
visited.insert(v);
58+
m_var_set.insert(v);
59+
var2occurs.reserve(v + 1);
60+
for (auto ci : var2occurs[v].constraints) {
61+
m_constraint_set.insert(ci);
62+
auto const& c = lra.constraints()[ci];
63+
for (auto const& [coeff, w] : c.coeffs())
64+
todo.push_back(w);
65+
}
66+
for (auto w : var2occurs[v].monics)
67+
todo.push_back(w);
68+
69+
for (auto ti : var2occurs[v].terms) {
70+
for (auto iv : lra.get_term(ti))
71+
todo.push_back(iv.j());
72+
todo.push_back(ti);
73+
}
74+
75+
if (lra.column_has_term(v)) {
76+
m_term_set.insert(v);
77+
for (auto kv : lra.get_term(v))
78+
todo.push_back(kv.j());
79+
}
80+
81+
if (c.is_monic_var(v)) {
82+
m_mon_set.insert(v);
83+
for (auto w : c.emons()[v])
84+
todo.push_back(w);
85+
}
86+
}
87+
}
88+
}

src/math/lp/nla_coi.h

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
2+
/*++
3+
Copyright (c) 2025 Microsoft Corporation
4+
5+
Abstract:
6+
Class for computing the cone of influence for NL constraints.
7+
It includes variables that come from monomials that have incorrect evaluation and
8+
transitively all constraints and variables that are connected.
9+
10+
Author:
11+
Lev Nachmanson (levnach)
12+
Nikolaj Bjorner (nbjorner)
13+
--*/
14+
15+
#pragma once
16+
17+
namespace nla {
18+
19+
class core;
20+
21+
class coi {
22+
core& c;
23+
indexed_uint_set m_mon_set, m_constraint_set;
24+
indexed_uint_set m_term_set, m_var_set;
25+
26+
struct occurs {
27+
unsigned_vector constraints;
28+
unsigned_vector monics;
29+
unsigned_vector terms;
30+
};
31+
32+
public:
33+
coi(core& c) : c(c) {}
34+
35+
void init();
36+
37+
indexed_uint_set const& mons() const { return m_mon_set; }
38+
indexed_uint_set const& constraints() const { return m_constraint_set; }
39+
indexed_uint_set& terms() { return m_term_set; }
40+
indexed_uint_set const &vars() { return m_var_set; }
41+
42+
};
43+
}

src/math/lp/nla_core.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,12 @@ class core {
450450
nla_throttle& throttle() { return m_throttle; }
451451
const nla_throttle& throttle() const { return m_throttle; }
452452

453+
lp::lar_solver& lra_solver() { return lra; }
454+
455+
indexed_uint_set const& to_refine() const {
456+
return m_to_refine;
457+
}
458+
453459
}; // end of core
454460

455461
struct pp_mon {

0 commit comments

Comments
 (0)