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+ }
0 commit comments